Opaque Type
調べようとしたモチベ
未解決: Swift UIで登場する、some Body {}ってどの文法に基づいているの?
不透明型
code:swift
func f(arg1:T1): some I1{
/* ... */
return result;
}
some I1とは、プロトコルI1を実装した何らかの型(I1実装型)を表す。
この点Existential Typeと類似点がある
ただしExistential Typeとは違い、実行中ある一つの定まったI1実装型(some I1)を扱っている。
このsome I1の具体的な型はコンパイル時に決定できる必要がある。
any I1を実現するために必要だったExistential Containerに入れてデータを扱う必要もなく、オーバーへッドがない。
この関数の利用者から見てわかるのは、I1を実装する何かのオブジェクトが返るというだけ
具体的にそれがどのような型なのかは知ることができない。
これにより、実装の隠蔽を実現できる場合がある。
関数の実装者は、ある具体的な型を返すものとして実装する。
それと同時に、外部に公開される戻り値の型に、具体的なI1実装型を指定しない。
関数の利用者は、これにより「戻り値の型が具体的にどのI1実装型なのか」に依存しないコードを書かなければならない。
外部から見ると戻り値の制約が少ない。
こうすると、何か内部に変更があったとしても、制約が緩いので外部に変更が及びにくい。
実装者が具体的な型を定めて書き、使用者が抽象的な型をもとにして書く。
この構造は本来のジェネリクスとは真逆になっている。
リバースジェネリクス
参考
Opaque Types - The Swift Programming Language Swift 5.5
Swift 5.1 に導入される Opaque Result Type とは何か
Type Erasure in Java Explained